package com.sailors.common.task.provider.infra.repository.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sailors.common.task.provider.faced.model.dto.query.WebFileTaskQueryDto;
import com.sailors.common.task.provider.faced.model.enums.StatusEnum;
import com.sailors.common.task.provider.faced.model.enums.TaskDelayedLevelEnum;
import com.sailors.common.task.provider.faced.model.enums.TaskStatusEnum;
import com.sailors.common.task.provider.infra.design.common.exception.BussinessException;
import com.sailors.common.task.provider.infra.design.common.util.DateTimeUtils;
import com.sailors.common.task.provider.infra.repository.IFileTaskLogRepository;
import com.sailors.common.task.provider.infra.repository.dao.TaskLogMapper;
import com.sailors.common.task.provider.infra.repository.model.FileTaskLogPo;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * <p>
 * 任务进度表 服务实现类
 * </p>
 *
 * @author cyj
 * @since 2022-11-22
 */
@Service
public class FileTaskLogRepository extends ServiceImpl<TaskLogMapper, FileTaskLogPo> implements IFileTaskLogRepository {

    @Override
    public Page<FileTaskLogPo> commonPage(WebFileTaskQueryDto webFileTaskQueryDto) {

        LambdaQueryWrapper<FileTaskLogPo> effectiveWrapper = getEffectiveWrapper();
        effectiveWrapper.eq(StringUtils.isNotEmpty(webFileTaskQueryDto.getBussinessName()), FileTaskLogPo::getBussinessName, webFileTaskQueryDto.getBussinessName())
                .eq(null != webFileTaskQueryDto.getTaskType(), FileTaskLogPo::getTaskType, webFileTaskQueryDto.getTaskType())
                .in(CollectionUtils.isNotEmpty(webFileTaskQueryDto.getStatus()), FileTaskLogPo::getStatus, webFileTaskQueryDto.getStatus())
                .in(CollectionUtils.isNotEmpty(webFileTaskQueryDto.getIds()), FileTaskLogPo::getId, webFileTaskQueryDto.getIds());

        if (StringUtils.isNotBlank(webFileTaskQueryDto.getStartTime())) {
            effectiveWrapper.ge(FileTaskLogPo::getCreateTime, webFileTaskQueryDto.getStartTime());
        }
        if (StringUtils.isNotBlank(webFileTaskQueryDto.getEndTime())) {
            effectiveWrapper.le(FileTaskLogPo::getCreateTime, webFileTaskQueryDto.getEndTime());
        }
        effectiveWrapper.orderByDesc(FileTaskLogPo::getCreateTime);
        return page(new Page<>(webFileTaskQueryDto.getPageNumber(), webFileTaskQueryDto.getPageSize()), effectiveWrapper);
    }

    @Override
    public void saveCommon(FileTaskLogPo fileTaskLogPo) {
        this.save(fileTaskLogPo);
    }

    @Override
    public List<FileTaskLogPo> getAllNeedDelayed() {
        return list(getEffectiveWrapper().eq(FileTaskLogPo::getStatus, TaskStatusEnum.PROCESS.getCode())
                .ne(FileTaskLogPo::getDelayedCheck, TaskDelayedLevelEnum.NONE.getCode()));
    }

    @Override
    public List<String> bussiness() {
        LambdaQueryWrapper<FileTaskLogPo> effectiveWrapper = getEffectiveWrapper();
        effectiveWrapper.select(FileTaskLogPo::getBussinessName).groupBy(FileTaskLogPo::getBussinessName);
        return this.list(effectiveWrapper).stream().map(FileTaskLogPo::getBussinessName).collect(Collectors.toList());
    }

    private LambdaQueryWrapper<FileTaskLogPo> getEffectiveWrapper() {
        return getWrapper().eq(FileTaskLogPo::getDeleted, StatusEnum.NO.id);
    }

    private LambdaQueryWrapper<FileTaskLogPo> getWrapper() {
        return Wrappers.lambdaQuery();
    }
}
